package com.leyou.item.service;

import com.gitee.yongzhuzl.commonutil.util.empty.EmptyUtil;
import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exception.LyException;
import com.leyou.item.mapper.SpecGroupMapper;
import com.leyou.item.mapper.SpecParamMapper;
import com.leyou.item.pojo.SpecGroup;
import com.leyou.item.pojo.SpecParam;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * description: 规格参数相关业务
 * @author 朱正磊
 * @date 2021-04-01 13:15:37
 */
@Service
public class SpecificationService {

    @Resource
    private SpecGroupMapper specGroupMapper;

    @Resource
    private SpecParamMapper specParamMapper;

    /**
     * description: 根据商品分类id查询规格参数组集合
     * @author 朱正磊
     * @date 2021-04-01 13:35:13
     * @param cid 商品分类id
     * @return 返回规格参数组集合
     */
    public List<SpecGroup> querySpecGroupsByCid(Long cid) {
        // 构造查询条件
        SpecGroup specGroup = new SpecGroup();
        specGroup.setCid(cid);
        // 根据查询条件进行查询
        List<SpecGroup> specGroups = specGroupMapper.select(specGroup);
        if (EmptyUtil.isEmpty(specGroups)) {
            throw new LyException(ExceptionEnum.SPEC_GROUP_NOT_FOUND);
        }
        return specGroups;
    }

    /**
     * description: 根据商品规格参数组id或者商品分类id或者是否为搜索规格参数查询商品规格参数集合
     * @author 朱正磊
     * @date 2021-04-01 14:48:43
     * @param gid 商品规格参数组id
     * @return 返回商品规格参数集合
     */
    public List<SpecParam> querySpecParams(Long gid, Long cid, Boolean searching) {
        // 构造查询条件
        SpecParam specParam = new SpecParam();
        // 如果gid不传，那么gid则为null，那么就不作为过滤条件，满足我们的业务
        specParam.setGroupId(gid);
        // 如果cid不传，那么cid则为null，那么就不作为过滤条件，满足我们的业务
        specParam.setCid(cid);
        // 如果searching不传，那么searching则为null，那么就不作为过滤条件，满足我们的业务
        specParam.setSearching(searching);
        // 根据查询条件进行查询
        List<SpecParam> specParams = specParamMapper.select(specParam);
        if (EmptyUtil.isEmpty(specParams)) {
            throw new LyException(ExceptionEnum.SPEC_PARAM_NOT_FOUND);
        }
        return specParams;
    }

    /**
     * description: 根据商品分类id查询规格参数组以及组内规格参数
     * @author 朱正磊
     * @date 2021-04-12 00:35:44
     * @param cid 商品分类id
     * @return 返回规格参数组以及组内规格参数
     */
    public List<SpecGroup> queryGroupsByCid(Long cid) {
        List<SpecGroup> groups = this.querySpecGroupsByCid(cid);
        // 设置组内规格参数
        // 方案一，查询次数太多效率低，不建议
        // groups.forEach(group -> group.setParams(this.querySpecParams(group.getId(), null, null))); //

        // 方案二，只需要查询一次效率高，推荐
        // 查询当前分类下的规格参数
        List<SpecParam> specParams = this.querySpecParams(null, cid, null);
        // 先把规格参数转换成Map，key是规格组id，value是规格组下所有的规格参数
        Map<Long, List<SpecParam>> paramMap = new HashMap<>(16);
        for (SpecParam specParam : specParams) {
            Long groupId = specParam.getGroupId();
            if (!paramMap.containsKey(groupId)) {
                paramMap.put(groupId, new ArrayList<>());
            }
            paramMap.get(groupId).add(specParam);
        }
        // 填充param到group
        for (SpecGroup group : groups) {
            group.setParams(paramMap.get(group.getId()));
        }

        // 返回规格参数组以及组内规格参数
        return groups;
    }

}
